/* eslint-disable no-undef */
//字体类型
let fontType = {
  En0: 0,
  En1: 1,
  En2: 2,
  En3: 3,
  En4: 4,
  En5: 5,
  En6: 6,
  En7: 7,
  Cn1: 24,
  Cn2: 55,
  CnZebra: 'GBUNSG24.CPF',
} //斑马机可用英文字体 1,5,7
//字体大小
let fontSize = {
  S1: 1,
  S2: 2,
  S3: 3,
  S4: 4,
  S5: 5,
  S6: 6,
  S7: 7,
  C0: 0,
}
let tools = {
  /** 设置纸张
   * @pageWidth: 宽
   * @pageHeight: 高
   * @printTimes: 打印张数
   */
  pageSetup({ pageWidth = '', pageHeight = '', printTimes = '' }) {
    let ary = []
    ary.push(`! 0 200 200 ${pageHeight} ${printTimes} \r\n`)
    ary.push('ENCODING GB18030\r\n')
    ary.push(`PAGE-WIDTH ${pageWidth} \r\n`)
    return ary.join('')
  },
  /** 打印线框（矩形）
   * @x_left: 左上角x坐标
   * @y_left: 左上角y坐标
   * @x_right: 右下角x坐标
   * @y_right: 右下角y坐标
   * @lineWidth: 线宽
   */
  drawBox({ x_left = '', y_left = '', x_right = '', y_right = '', lineWidth = '' }) {
    let ary = []
    ary.push('BOX' + ' ' + x_left + ' ' + y_left + ' ' + x_right + ' ' + y_right + ' ' + lineWidth + '\r\n')
    return ary.join('')
  },
  /** 打印线条
   * @x_start: 起始点x坐标
   * @y_start: 起始点y坐标
   * @x_end: 终点x坐标
   * @y_end: 终点y坐标
   * @lineWidth: 线条宽度
   */
  drawLine({ x_start = '', y_start = '', x_end = '', y_end = '', lineWidth = '' }) {
    let ary = new Array()
    ary.push('LINE' + ' ' + x_start + ' ' + y_start + ' ' + x_end + ' ' + y_end + ' ' + lineWidth + '\r\n')
    return ary.join('')
  },

  /** 打印点线条，但由于生成命令过多，会死机 (芝柯XT423会死机)
   * @x_start: 起始点x坐标
   * @y_start: 起始点y坐标
   * @x_end: 终点x坐标
   * @y_end: 终点y坐标
   * @lineWidth: 线条宽度
   * 只支持水平线或垂直线
   */
  drawDotLine({ x_start = '', y_start = '', x_end = '', y_end = '', lineWidth = '', dotWidth = '' }) {
    let ary = []
    if (!(x_start == x_end || y_start == y_end)) {
      return drawLine(x_start, y_start, x_end, y_end, lineWidth)
    }
    let toEnd = 0
    let curLoc = 0
    if (x_start == x_end) {
      toEnd = y_start > y_end ? y_start : y_end
      curLoc = y_start < y_end ? y_start : y_end
    } else {
      toEnd = x_start > x_end ? x_start : x_end
      curLoc = x_start < x_end ? x_start : x_end
    }
    let xy = 2
    while (curLoc < toEnd && xy < 1000) {
      for (let i = 0; i < dotWidth.length; i++) {
        if (xy % 2 == 0) {
          if (x_start == x_end) {
            ary.push(
              'LINE' + ' ' + x_start + ' ' + curLoc + ' ' + x_end + ' ' + (parseInt(curLoc) + parseInt(dotWidth[i])) + ' ' + lineWidth + '\r\n'
            )
          } else {
            ary.push(
              'LINE' + ' ' + curLoc + ' ' + y_start + ' ' + (parseInt(curLoc) + parseInt(dotWidth[i])) + ' ' + y_end + ' ' + lineWidth + '\r\n'
            )
          }
        }
        curLoc = parseInt(curLoc) + parseInt(dotWidth[i])
        xy++
      }
    }
    return ary.join('')
  },
  /** 打印一维条码
   * @type: 一维码类型，如39，128等
   * @width: 条码间隙宽度
   * @height: 条码高度
   * @x: 条码正文左上角X坐标
   * @y: 条码正文左上角Y坐标
   * @data: 条码内码
   * @showText: 是否在条码下显示内容字符，1 为显示
   * @vertical: 是否旋转条码，逆时针90度，1 为旋转
   */
  drawBarCode({ type = '', width = '', height = '', x = '', y = '', data = '', showText = '', vertical = '' }) {
    let ary = []
    if (showText != null && showText == 1) {
      ary.push('BARCODE-TEXT 7 1 1\r\n')
    }
    ary.push(
      (vertical != null && vertical == 1 ? 'V' : '') +
        'BARCODE' +
        ' ' +
        type +
        ' ' +
        width +
        ' ' +
        '1' +
        ' ' +
        height +
        ' ' +
        x +
        ' ' +
        y +
        ' ' +
        data +
        '\r\n'
    )
    if (showText != null && showText == 1) {
      ary.push('BARCODE-TEXT OFF\r\n')
    }
    return ary.join('')
  },
  /** PDF类型条码打印
   * @x: 条码开始的X轴坐标
   * @y: 条码开始的Y轴坐标
   * @XD: 宽度最小点数，值的范围为1-32，默认为2
   * @YD: 高度最小点数，值的范围为1-32，默认为6
   * @C: 每行容纳的码数，值的范围为1-30，默认为3
   * @S: 纠错等级，值的范围为0-8，默认为1
   * @data： PDF-417条码数据
   * @vertical vertical 是否旋转条码，逆时针90度，1 为旋转
   */
  drawPDF417({ x = '', y = '', XD = '', YD = '', C = '', S = '', data = '', vertical = '' }) {
    let ary = []
    ary.push(
      (vertical != null && vertical == 1 ? 'V' : '') + 'B PDF-417' + ' ' + x + ' ' + y + ' XD ' + XD + ' YD ' + YD + ' C ' + C + ' S ' + S + '\r\n'
    )
    ary.push(data + '\r\n')
    ary.push('ENDPDF\r\n')
    return ary.join('')
  },
  /** 简易形PDF类型条码打印(只传坐标，条码大小，打印内容)
   * @x: 条码开始的X轴坐标
   * @y: 条码开始的Y轴坐标
   * @size: 条码大小，支持（1-7），其余默认为1
   * @data： PDF-417条码数据
   * @vertical vertical 是否旋转条码，逆时针90度，1 为旋转
   */
  drawPDF417Easy({ x = '', y = '', size = '', data = '', vertical = '' }) {
    let XD = 1
    let YD = 5
    if (size != null && parseInt(size) > 1 && parseInt(size) < 7) {
      XD = parseInt(XD) + parseInt(size) - 1
      YD = parseInt(YD) + parseInt(size) - 1
    }
    let ary = []
    ary.push((vertical != null && vertical == 1 ? 'V' : '') + 'B PDF-417' + ' ' + x + ' ' + y + ' XD ' + XD + ' YD ' + YD + ' C 2 S 1\r\n')
    ary.push(data + '\r\n')
    ary.push('ENDPDF\r\n')
    return ary.join('')
  },
  /**
   * @x: 条码开始的X轴坐标
   * @y: 条码开始的Y轴坐标
   * @M: QR代码型号,值的范围是1-2，默认为2
   * @U: 高度/宽度的模块点数，相当于size
   * @data: 打印数据
   * @vertical: 是否旋转条码，逆时针90度，1 为旋转
   */
  drawQRCode({ x = '', y = '', M = '', U = '', data = '', vertical = '' }) {
    let ary = []
    ary.push((vertical != null && vertical == 1 ? 'V' : '') + 'BARCODE QR' + ' ' + x + ' ' + y + ' M ' + M + ' U ' + U + '\r\n')
    ary.push('MA,' + data + '\r\n')
    ary.push('ENDQR\r\n')
    return ary.join('')
  },
  /**
   * 功能描述: 支持换行的批量文本打印方法
   * @fontTypeList: 字符类型 英文0~7，中文 24,55 (斑马机器用GBUNSG24.CPF)
   * @fontSizeList: 字符大小(中文字体，除同采外，不支持设置大小，只能用0，要放大字体，请使用setMagSizeW，setMagSizeH来设置)
   * @xList: 字符左上角X坐标
   * @yList: 字符左上角Y坐标
   * @boldList: 是否加粗，1 为加粗
   * @dataList: 字符内容
   * @charNumList: 需要换行的字符长度
   * @textHighList: 字符占用的高度，需要实际打印判断需要的高度
   * @verticalList: 是否旋转条码，逆时针90度，1 为旋转
   * @setMagSizeWList: 宽度放大比例
   * @setMagSizeHList: 高度放大比例
   * @return:[row_print_info,row_end_max_site]
   * @auther: ZhangPeng
   * @date: 2019/3/7 15:20
   */
  drawBatchWrapText({
    fontTypeList = '',
    fontSizeList = '',
    xList = '',
    yList = '',
    boldList = '',
    dataList = '',
    charNumList = '',
    textHighList = '',
    verticalList = '',
    setMagSizeWList = '',
    setMagSizeHList = '',
  }) {
    //1. 初始化参数
    let params = [
      fontTypeList,
      fontSizeList,
      xList,
      yList,
      boldList,
      dataList,
      charNumList,
      textHighList,
      verticalList,
      setMagSizeWList,
      setMagSizeHList,
    ]
    let equalLen = -1 // 批量的个数
    //2. 检查数据长度的一致性
    for (let i = 0; i < params.length; i++) {
      //2.1. 如果传有值，则进行长度检查
      if (params[i] != undefined && params[i] != null && params[i].length > 0) {
        //2.1.1. 保存第一个参数的个数
        if (equalLen == -1) {
          equalLen = params[i].length
          continue
        }
        //2.1.2. 如果后续入参和第一个记录的参数的个数不一致，直接返回空的信息
        if (equalLen != params[i].length) {
          console.log('[drawBatchWrapText] ' + i + ' parameters number is different!')
          return ['', '']
        }
      } else {
        //2.2. 如果没有传入参数，对部分参数进行默认值初始化
        //2.2.1. data以前的入参都是必填的，没有就返回空
        if (i <= 5) {
          console.log('[drawBatchWrapText] ' + i + ' parameters must be filled!')
          return ['', '']
        } else {
          params[i] = []
        }
      }
    }
    //3. 进行批量处理
    let arr = [] // 保存打印信息
    let row_end_high = [] // 保存每次的结束高度
    for (let i = 0; i < equalLen; i++) {
      let result = drawWrapText(
        params[0][i],
        params[1][i],
        params[2][i],
        params[3][i],
        params[4][i],
        params[5][i],
        params[6][i],
        params[7][i],
        params[8][i],
        params[9][i],
        params[10][i]
      )
      arr.push(result[0])
      row_end_high.push(result[1])
    }
    //4. 返回 [打印信息，最大的高度]
    return [arr.join(''), Math.max.apply(null, row_end_high)]
  },

  /**
   * 功能描述: 支持换行的文本打印方法
   * @fontType: 字符类型 英文0~7，中文 24,55 (斑马机器用GBUNSG24.CPF)
   * @fontSize: 字符大小(中文字体，除同采外，不支持设置大小，只能用0，要放大字体，请使用setMagSizeW，setMagSizeH来设置)
   * @x: 字符左上角X坐标
   * @y: 字符左上角Y坐标
   * @bold: 是否加粗，1 为加粗
   * @data: 字符内容
   * @charNum: 需要换行的字符长度
   * @textHigh: 字符占用的高度，需要实际打印判断需要的高度
   * @vertical: 是否旋转条码，逆时针90度，1 为旋转
   * @setMagSizeW: 宽度放大比例
   * @setMagSizeH: 高度放大比例
   * @return: [row_print_info,row_end_site]
   * @auther: ZhangPeng
   * @date: 2019/3/7 11:48
   */
  drawWrapText({
    fontTypeName = 'Cn1',
    fontSizeName = 'C0',
    x = '150',
    y = '50',
    bold = '1',
    data = '中元汇吉生物技术有限公司',
    charNum = '',
    textHigh = '',
    vertical = '',
    setMagSizeW = '',
    setMagSizeH = '',
  }) {
    //1. 初始化必要参数
    let field_Content = data // 数据
    let field_Content_length = field_Content.length // 数据字符个数
    let text_high_start = y // 文本起始打印高度，左上角的y位置
    let text_high = textHigh != null && textHigh > 0 ? textHigh : 30 // 文本的高度，不同的字体大小占据不同的高度
    let width_qty = charNum != null && charNum > 0 ? charNum : 12 // 一列数据所允许的字符个数
    let arr = []
    //2. 如果没有数据，直接返回
    if (field_Content_length === 0) {
      console.log('[drawWrapText] data is empty!')
      return ['', y]
    }
    //3. // 数据小于允许的个数，直接显示
    if (field_Content.length > width_qty) {
      while (field_Content_length > 0) {
        if (field_Content_length > width_qty) {
          arr.push(
            drawText({
              fontTypeName: fontTypeName,
              fontSizeName: fontSizeName,
              x: x,
              y: text_high_start,
              bold: bold,
              data: field_Content.substring(0, width_qty),
              vertical: vertical,
              setMagSizeW: setMagSizeW,
              setMagSizeH: setMagSizeH,
            })
          )
          field_Content = field_Content.substring(width_qty) // 截取字符串
        } else {
          arr.push(
            drawText({
              fontTypeName: fontTypeName,
              fontSizeName: fontSizeName,
              x: x,
              y: text_high_start,
              bold: bold,
              data: field_Content,
              vertical: vertical,
              setMagSizeW: setMagSizeW,
              setMagSizeH: setMagSizeH,
            })
          )
          field_Content = '' // 因为全部输出了，清掉字符
        }
        field_Content_length = field_Content.length // 截取后的字符串长度
        text_high_start = text_high_start + text_high // 下一行高度
      }
    } else {
      // 如果长度不需要换行，直接放原来的位置
      let obj = {
        fontTypeName: fontTypeName,
        fontSizeName: fontSizeName,
        x: x,
        y: text_high_start,
        bold: bold,
        data: field_Content,
        vertical: vertical,
        setMagSizeW: setMagSizeW,
        setMagSizeH: setMagSizeH,
      }
      arr.push(drawText(obj))
    }
    return [arr.join(''), text_high_start]
  },

  /** 打印文字
   * @fontType: 字符类型 英文0~7，中文 24,55 (斑马机器用GBUNSG24.CPF)
   * @fontSize: 字符大小(中文字体，除同采外，不支持设置大小，只能用0，要放大字体，请使用setMagSizeW，setMagSizeH来设置)
   * @x: 字符左上角X坐标
   * @y: 字符左上角Y坐标
   * @bold: 是否加粗，1 为加粗
   * @data: 字符内容
   * @vertical: 是否旋转条码，逆时针90度，1 为旋转
   * @setMagSizeW: 宽度放大比例
   * @setMagSizeH: 高度放大比例
   */
  drawText({ fontTypeName = '', fontSizeName = '', x = '', y = '', bold = '', data = '', vertical = '', setMagSizeW = '', setMagSizeH = '' }) {
    let ary = new Array()
    let toMagSizeW = setMagSizeW != null && parseInt(setMagSizeW) > 0 ? setMagSizeW : 0
    let toMagSizeH = setMagSizeH != null && parseInt(setMagSizeH) > 0 ? setMagSizeH : 0
    if (bold != null && bold == 1) {
      ary.push('SETBOLD 2\r\n')
    }
    if (parseInt(toMagSizeW) + parseInt(toMagSizeH) > 0) ary.push('SETMAG ' + toMagSizeW + ' ' + toMagSizeH + '\r\n')
    //	ary.push((vertical!=null&&vertical==1?"V":"")+"TEXT"+" "+fontType+" "+fontSize+" "+x+" "+y+" "+data+"\r\n");
    console.log('我要看哼！', fontType, fontTypeName)

    if (vertical == 1) {
      ary.push('TEXT' + ' ' + fontType[fontTypeName] + ' ' + fontSize[fontSizeName] + ' ' + x + ' ' + y + ' ' + data + '\r\n')
    } else {
      ary.push('TEXT180' + ' ' + fontType[fontTypeName] + ' ' + fontSize[fontSizeName] + ' ' + x + ' ' + y + ' ' + data + '\r\n')
    }

    if (bold != null && bold == 1) {
      ary.push('SETBOLD 0\r\n')
    }
    if (parseInt(toMagSizeW) + parseInt(toMagSizeH) > 0) ary.push('SETMAG 0 0\r\n')
    return ary.join('')
  },

  /**
   * 执行打印
   * @printCode 之前组织好的打印命令
   * @addFrom 是否加上打印后走纸定位
   * @senseType 定们类型 2 为右黑标检测指令,3 为左黑标检测指令，其它为按标签检测指令
   */
  doPrint({ printCode = '', addFrom = '', senseType = '' }) {
    console.log('printCode', printCode)

    let ary = new Array()
    let sense = 'GAP-SENSE\r\n'
    if (senseType != null) {
      if (senseType == 2) sense = 'BAR-SENSE\r\n'
      if (senseType == 3) sense = 'BAR-SENSE LEFT\r\n'
    }
    for (let i = 0; i < printCode.length; i++) {
      if (addFrom != null && addFrom == 1 && printCode[i].indexOf('PAGE-WIDTH') != -1) {
        ary.push(printCode[i])
        ary.push(sense)
      } else {
        ary.push(printCode[i])
      }
    }
    if (addFrom != null && addFrom) ary.push('FORM\r\n')
    ary.push('ENCODING ASCII\r\n')
    ary.push('PRINT\r\n')
    return ary.join('')
  },

  /**
   * 打印图像
   * @param byteWidth: 位图的字节宽度
   * @param height: 位图的点高度
   * @param x: 位图左上角X坐标
   * @param y: 位图左上角Y坐标
   * @param data: 位图数据
   * @param vertical: 是否旋转，逆时针90度，1 为旋转
   * @param command: 打印命令，可支持CG（位图数据是8B的字符）及EG（位图数据是16B的字符）
   * @returns
   */
  drawPic({
    byteWidth = '',
    height = '',
    x = '',

    y = '',
    data = '',
    vertical = '',
    command = '',
  }) {
    let ary = new Array()
    let realCommand = (command != null && command.length > 0 ? command : 'EG ') + byteWidth + ' ' + height + ' ' + x + ' ' + y + ' '
    ary.push((vertical != null && vertical == 1 ? 'V' : '') + realCommand)
    ary.push(data + '\r\n')
    return ary.join('')
  },
}

export default tools
